package 行为型模式.责任链模式;

/**
 * 主要组成部分
 * Handler (处理者接口)
 * 定义处理请求的接口
 * 通常包含一个方法来设置下一个处理者
 * 包含处理请求的方法
 * ConcreteHandler (具体处理者)
 * 实现处理请求的具体逻辑
 * 决定是否处理请求或传递给下一个处理者
 * Client (客户端)
 * 组装责任链
 * 向链上的第一个处理者提交请求
 */


class Item
{
	private String name;
	private Double price;

	Item(String name, Double price) {
		this.name = name;
		this.price = price;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

interface IHandle
{
	void setItem(IHandle handle);
	void run(Item item);
}

class HandleA implements IHandle
{
	IHandle next;
	@Override
	public void setItem(IHandle handle)
	{
		next = handle;
	}

	@Override
	public void run(Item item)
	{
		if(item.getPrice() > 5)
		{
			System.out.println(item.getName()+"价格高于5元");
		}
		if(next == null)
		{
			return;
		}
		//传递
		next.run(item);
	}
}

class HandleB implements IHandle
{
	IHandle next;
	@Override
	public void setItem(IHandle handle)
	{
		next = handle;
	}
	
	@Override
	public void run(Item item)
	{

		if(item.getPrice() > 10)
		{
			System.out.println(item.getName()+"价格高于10元");

		}
		if(next == null)
		{
			return;
		}
		//传递
		next.run(item);
	}
}



public class ChainOfResponsibility 
{
	public static void main(String[] args) 
	{
		Item milkA = new Item("milkA", 6d);
		Item milkB = new Item("milkB", 20d);
		//设置责任链
		HandleA handleA = new HandleA();
		HandleB handleB = new HandleB();
		handleA.setItem(handleB);
		
		handleA.run(milkA);
		handleA.run(milkB);

	}
}
